package controller.editorcontroller;

import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JTree;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;
import javax.swing.tree.DefaultMutableTreeNode;
import view.commonview.ButtonValues;
import view.commonview.ToolBar;
import view.editorview.ComponentPanel;
import model.LogicType;

/**
 * <b>Implementiert:</b> <code>TreeSelectionListener</code> <br>
 * <b>In Verbindung stehende Klassen:</b> <code>ComponentHandler, ToolBar</code><br>
 * <br>
 * Listener, der auf dem <code>ComponentTree</code> liegt. Bauteil kann hiermit
 * auesgewaehlt werden. Welches Bauteil ausgewaehlt wurde, wird an den
 * <code>ComponentHandler</code> weitergegeben.
 * 
 * @author Team Locsi
 * 
 */
public class ComponentTreeListener implements TreeSelectionListener {

	private ComponentPanel panel;
	private ToolBar toolBar;

	/**
	 * Dieser Konstruktor erzeugt ein neues <code>ComponentTreeListener</code>
	 * -Objekt.
	 * 
	 * @param panel
	 *            <code>ComponentPanel</code> - Referenz auf das
	 *            <code>ComponentPanel</code>
	 * @param toolBar
	 *            <code>ToolBar</code> - Referenz auf die <code>ToolBar</code>
	 */
	public ComponentTreeListener(ComponentPanel panel, ToolBar toolBar,
			JTree tree) {
		this.panel = panel;
		this.toolBar = toolBar;
		addHelpListener(tree);
	}
	
	/**
	 * Listener der den Bug beseitigt, dass man im JTree nicht das Bauteil
	 * auswaehlen konnte, dass man davor ausgewaehlt hatte und man sich zuvor im 
	 * Selection-Modus befunden hat.
	 * Setzt bei jedem klick in den JTree den Modus auf INSERTION
	 * 
	 * @param tree der JTree auf dem der Listener liegt
	 */
	private void addHelpListener(JTree tree) {
		tree.addMouseListener(new MouseAdapter() {
			@Override
			public void mousePressed(MouseEvent e) {
				toolBar.setCurrentMode(ButtonValues.INSERTION_MODE);
			}
		});
	}

	/**
	 * Diese Methode setzt den Modus der <code>ToolBar</code> auf
	 * <code>INSERTION_MODE</code> und setzt den aktuell ausgewaehlten Typ im
	 * <code>ComponentPanel</code>
	 */
	@Override
	public void valueChanged(TreeSelectionEvent e) {
		Object sel = (((DefaultMutableTreeNode) e.getPath()
				.getLastPathComponent()).getUserObject());
		
		//sel == null für leitungen legen
		if (sel instanceof LogicType || sel == null) {
			if (((LogicType) sel) == LogicType.SELFDEFINED) {
				panel.setActualSelected((LogicType) sel);
				toolBar.setCurrentMode(ButtonValues.INSERTION_MODE);
				panel.setNameOfSelectedSelfDefined(((DefaultMutableTreeNode) e
						.getPath().getLastPathComponent()).toString());
			} else {
				panel.setActualSelected((LogicType) sel);
				toolBar.setCurrentMode(ButtonValues.INSERTION_MODE);
			}
		} else {
			toolBar.setCurrentMode(ButtonValues.SELECTION_MODE);
		}
	}
}